﻿using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace T4UtilityBelt.Utilities
{


////////
//////// UTILITY METHODS - do not modify anything below this point
////////

//
// Code for building up a convenient item collection for the CSDL from the EDMX
//

//private ItemCollectionWrapper<EdmItemCollection> GetEdmItemCollection(string edmxFile)
//{
//    EdmItemCollection edmItems = new EdmItemCollection(new XmlReader[] { GetCSDLReader(edmxFile) });
//    return new ItemCollectionWrapper<EdmItemCollection>(edmItems);
//}

//private XmlReader GetCSDLReader(string edmxFile)
//{
//    XNamespace edmxns = "http://schemas.microsoft.com/ado/2008/10/edmx";
//    XNamespace csdlns = "http://schemas.microsoft.com/ado/2008/09/edm";

//    XDocument edmxDoc = XDocument.Load(edmxFile);
//    XElement edmxNode = edmxDoc.Element(edmxns + "Edmx");
//    XElement runtimeNode = edmxNode.Element(edmxns + "Runtime");
//    XElement conceptualModelsNode = runtimeNode.Element(edmxns + "ConceptualModels");
//    XElement csdlContent = conceptualModelsNode.Element(csdlns + "Schema");
//    return csdlContent.CreateReader();
//}

//public class ItemCollectionWrapper<T>  where T : ItemCollection
//{
//    T _collection;
//    public ItemCollectionWrapper(T collection)
//    {
//        _collection = collection;
//    }

//    public T Collection { get{ return _collection; }}

//    public IEnumerable<EntityContainer> AllEntityContainers
//    {
//        get
//        {
//            return _collection.GetItems<EntityContainer>();
//        }
//    }

//    public IEnumerable<EntityType> AllEntities
//    {
//        get
//        {
//            return _collection.GetItems<EntityType>();
//        }
//    }

//    public IEnumerable<AssociationType> AllAssociations
//    {
//        get
//        {
//            return _collection.GetItems<AssociationType>();
//        }
//    }
    
//    public string NamespaceName
//    {
//        get
//        {
//            EntityType type = this.AllEntities.FirstOrDefault(e => e.NamespaceName != null);
//            if (type != null && type.NamespaceName != null)
//            {
//                return type.NamespaceName;
//            }
//            return null;
//        }
//    }
//}

//
// Convenience methods
//

//public EntityType GetEntityType(RelationshipEndMember end)
//{
//    return (EntityType)((RefType)end.TypeUsage.EdmType).ElementType;
//}

//public string GetEnumValueString(object enumValue)
//{
//    Type type = enumValue.GetType();
//    Debug.Assert(type.IsEnum, "this type is not an enum");

//    return type.FullName + "." + enumValue.ToString();
//}

//bool IncludePropertyInFactoryMethod(EdmProperty property)
//{
//    if (property.Nullable)
//    {
//        return false;
//    }
//    if (property.DefaultValue != null)
//    {
//        return false;
//    }

//    return true;
//}

//string GetSetValidValueParameters(PrimitiveType type, bool nullable)
//{
//    string parameters = "value";
//    if(type.ClrEquivalentType.IsClass)
//        parameters += ", " + nullable.ToString().ToLower();
		
//    return parameters;
//}

//
// language specific code generation classes
//
	
//abstract class CodeLanguage 
//{
//    protected CodeDomProvider CodeDomProvider { get; set; }
	
//    protected CodeLanguage(CodeDomProvider codeDomProvider) 
//    {
//        CodeDomProvider = codeDomProvider;
//    }
	
//    public String Format(Type type) 
//    {
//        return ShortenTypeRef(CodeDomProvider.GetTypeOutput(new CodeTypeReference(type)));
//    }
	
//    //public String Format(TypeUsage typeUsage)
//    //{
//    //    if(typeUsage.EdmType is ComplexType)
//    //    {
//    //        return typeUsage.EdmType.Name;
//    //    }
//    //    else if (typeUsage.EdmType is PrimitiveType)
//    //    {
//    //        Type clrType = ((PrimitiveType)typeUsage.EdmType).ClrEquivalentType;
//    //        string elementType = Format(clrType);
//    //        if(clrType.IsValueType && IsNullable(typeUsage))
//    //        {
//    //            return elementType + "?";
//    //        }
//    //        return elementType;
//    //    }
		
//    //    return "UnknownType";
//    //}
	
//    public String FormatIdentifier(string identifier)
//    {
//        return CodeDomProvider.CreateEscapedIdentifier(identifier);
//    }
	
//    public string FormatParameter(string identifier)
//    {
//        return FormatIdentifier(CamelCase(identifier));
//    }
	
//    public string FormatField(string identifier)
//    {
//        return FormatIdentifier("_" + identifier);
//    }
	
//    protected string CamelCase(string identifier)
//    {
//        if (string.IsNullOrEmpty(identifier))
//            return identifier;

//        if (identifier.Length == 1)
//            return identifier[0].ToString(System.Globalization.CultureInfo.InvariantCulture).ToLowerInvariant();

//        return identifier[0].ToString(System.Globalization.CultureInfo.InvariantCulture).ToLowerInvariant() + identifier.Substring(1);
//    }
	
//    protected virtual String ShortenTypeRef(String typeRef) 
//    {
//        return (typeRef.LastIndexOf('.') != 6) ? typeRef.Replace("System.Data.Linq.","") : typeRef.Replace("System.","");
//    }
	
//    protected String Format(CodeTypeReference codeTypeRef) 
//    {
//        return ShortenTypeRef(CodeDomProvider.GetTypeOutput(codeTypeRef));
//    }
	
//    //protected bool IsNullable(TypeUsage typeUsage)
//    //{
//    //    return (bool)typeUsage.Facets["Nullable"].Value;
//    //}
//}

//class CSharpCodeLanguage : CodeLanguage 
//{
//    public CSharpCodeLanguage() : base(new Microsoft.CSharp.CSharpCodeProvider()) { }

//    protected override String ShortenTypeRef(String typeRef) 
//    {
//        if (typeRef.StartsWith("System.Nullable<"))
//            typeRef = typeRef.Replace("System.Nullable<","").Replace(">","?");
//        return base.ShortenTypeRef(typeRef);
//    }
//}


}
